1.1 Dart 运行模式
Dart 语言的一大特色是支持 JIT 和 AOT 两种运行模式。
JIT(just-in-time) 和 AOT(ahead-of-time)两种模式的编译方式和运行方式都有很大不同。
JIT、AOT 特性对比
项目 | JIT | AOT |
---|---|---|
性能 | 由于需要预热,启动速度较慢,但随着时间的推移会达到最佳性能 | 启动后很快就达到峰值性能(使用 JIT 时最大性能可能会更高) |
编译时机 | 运行时编译 | 预编译 |
编译时间 | 短 | 长 |
目的 | 提供快速稳定的开发流程,例如Hot Reload | 重视用户体验 |
Dart Kernel 运行模式
除了 JIT 和 AOT 外,Dart 代码还支持以 Dart Kernel 的方式运行。
Dart Kernel 是 Dart 的 intermediate representation 中间语言,是 Dart 内部对抽象语法树的表示结构。具体可参见 2.1 Dart Kernel。
通过 dart compile kernel
可以将 Dart 源代码编译为 Kernel Binary(.dill
),然后通过 dart run
命令运行。
注:通过
dart run
也可以直接运行 Dart 源代码,在dart
命令内部,它会先将代码转为 Dart Kernel,再交由 DartVM 运行。
JIT、AOT 都需要 DartVM
JIT 需要 DartVM 比较好理解,就像 Java 与 JVM 一样,Java 字节码需要在 JVM 内才能运行。
比较难以理解的一点,是 AOT 也需要 DartVM。AOT 不是都编译成机器码了吗?怎么还需要虚拟机呢?
造成理解困难的关键在与 DartVM 的命名上。DartVM 是可裁剪的。DartVM 由多个组件组成,包括运行时系统(对象模型、垃圾回收、快照……)、JIT 管道、AOT 管道、解释器等。
在 AOT 模式下,所需要的是一个最精简的 DartVM 裁剪版本,只提供最基础的垃圾回收和核心库等。相当于 JIT 下 DartVM 的功能子集。
因此,JIT 下需要全功能的 DartVM,AOT 下需要精简 DartVM。
本文作者:Maeiee
本文链接:1.1 Dart 运行模式
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!